<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/ajax.js"></script>
</head>

<body>

</body>
<script>
    // 构造函数本身自带方法      (对比Array.isArray())
    // Promise.all()  
    // Promise.race()  

    // Promise.all()方法用于将多个 Promise 实例，包装成一个新的 Promise 实例。
    // const p = Promise.all([p1, p2, p3]);
    // 上面代码中，Promise.all()方法接受一个数组作为参数，p1、p2、p3都是 Promise 实例,返回一个新的Promise 实例。

    // p的状态由p1、p2、p3决定，分成两种情况。

    // （1）只有p1、p2、p3的状态都变成fulfilled，p的状态才会变成fulfilled，此时p1、p2、p3的返回值组成一个数组，传递给p的回调函数。

    // （2）只要p1、p2、p3之中有一个被rejected，p的状态就变成rejected，此时第一个被reject的实例的返回值，会传递给p的回调函数。


    // 优点 同时发送多个请求  => 等所有请求成功之后 按顺序返回结果  
    // T1
    // T2    =>   按最慢的来
    // T3

    console.time("aa");
    var p1 = readText("../data/1.txt", 1000);  // 今天
    var p2 = readText("../data/2.txt", 500);  // demo_1111
    var p3 = readText("../data/3.txt", 5000); // 写了没?

    Promise.all([p1, p2, p3]).then(list => {
        console.log(list);
    }).catch(err => {
        console.log(err);
    })

    // 模拟封装
    // Promise.myAll = function (list) {
    //     return new Promise(function (resolve, reject) {
    //         var arr = [];
    //         for (let i = 0; i < list.length; i++) {
    //             var p = list[i];// 每一个Promise实例

    //             // 提前规定好每一个实例 成功和失败时执行的内容  => 请求有结果之后会执行
    //             p.then(txt => {  //等待异步操作有结果之后 对应下标放到数组中
    //                 arr[i] = txt;
    //                 console.timeLog("aa");
    //                 if (arr.length === list.length) { // 三个请求全都成功 => arr(异步)
    //                     // console.log(arr);
    //                     console.timeEnd("aa");

    //                     resolve(arr);
    //                 }
    //             }).catch(err => {
    //                 console.log(err);
    //                 reject(err);   //只要有一个失败 就走catch
    //             })
    //         }
    //     })
    // }

    // Promise.myAll([p1, p2, p3]).then(list => {
    //     console.log(list);
    // }).catch(err => {
    //     console.log(err);
    // })









    function readText(url, delay = 0) {
        var p = new Promise(function (resolve, reject) {
            setTimeout(function () {
                $.ajax({
                    type: "get",
                    url: url,
                    success: function (text) {
                        resolve(text);
                    }
                })
            }, delay)
        })
        return p; // {pending}
    }

</script>

</html>